package com.ecr.hub.front.validator;

import java.util.ArrayList;
import java.util.List;

import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;

import com.ecr.hub.util.MessageUtils;

/**
 * @author Patrice
 * @date 11 juil. 2011
 */
public abstract class AbstractValidator implements Validator {

	public static final String FIELD_NAME = "fieldName";

	protected FacesMessage getMessageValidator(String arg1, String[] arg2,
			Severity arg3, FacesContext arg4, UIComponent arg5)
			throws Exception {

		FacesMessage msg;
		String attributToDecode;
		ValueExpression valueExp;
		List<String> attributs = new ArrayList<String>();
		if (null != arg2) {
			for (String s : arg2) {
				attributToDecode = null;
				if (null != arg5.getValueExpression(s)) {
					valueExp = arg5.getValueExpression(s);
					attributToDecode = (String) valueExp.getValue(arg4
							.getELContext());
				} else if (null != arg4.getAttributes().get(s)) {
					attributToDecode = arg4.getAttributes().get(s).toString();
				}
				if (null != attributToDecode)
					attributs.add(attributToDecode);
			}
		}
		if (FacesMessage.SEVERITY_ERROR.equals(arg3)) {
			msg = MessageUtils.getMessageError(arg1, attributs.toArray());
		} else if (FacesMessage.SEVERITY_WARN.equals(arg3)) {
			msg = MessageUtils.getMessageWarn(arg1, attributs.toArray());
		} else {
			msg = MessageUtils.getMessageFatal(arg1, attributs.toArray());
		}
		msg.setDetail(null);
		return msg;
	}

	protected FacesMessage getMessageErrorInValidator(Exception e) {

		FacesMessage msg;
		try {
			String[] o = { e.getMessage() };
			msg = getMessageValidator("validator.internal.err", o,
					FacesMessage.SEVERITY_FATAL, null, null);

		} catch (Exception e1) {
			msg = new FacesMessage(e1.getMessage());
			msg.setSeverity(FacesMessage.SEVERITY_FATAL);
		}
		return msg;
	}

	// Récupération des attributs supplémentaires pour le UIComponent.
	protected abstract String[] getAttributsList();

	// Récupération de la clé pour le message d'erreur.
	protected abstract String getMessageKey();

	// Récupération du niveau d'erreur à positionner pour le message.
	protected abstract Severity getSeverityLevel();
}
